package com.xiaochen.manager.utils;

import com.xiaochen.model.entity.system.SysMenu;

import java.util.ArrayList;
import java.util.List;

/**
 * 封装树形菜单数据的工具类
 *
 * 理解:当我们拿到一个集合的时候，我们不是return 就是 便利
 */
public class MenuHelper {

    // 通过递归方法，将list集合封装成树形结构
    // (递归:就是自己重复调用自己,达到效果后结束)
    // 递归有两个关键:1.递归需要有一个入口
    // 查询菜单入口,找到顶层数据(select到parent_id = 0 的数据)
    // 2.递归需要有一个查找条件(select到子菜单的parent_id = 父菜单的id)
    public static List<SysMenu> buildTree(List<SysMenu> sysMenuList){
        // 完成菜单的组装
        // 1.创建list集合,用于数据最终返回
        List<SysMenu> trees = new ArrayList<>();
        // 遍历所有的菜单集合
        for (SysMenu sysMenu : sysMenuList) {
            // 找到递归的入口(找到谁的parent_id == 0)
            if (sysMenu.getParentId().longValue() == 0){
                // 根据第一层,找到下一层的数据，使用递归完成
                trees.add(findChildren(sysMenu,sysMenuList));
            }
        }
        return trees;
    }

    // 使用递归方法查找下层的菜单
    public static SysMenu findChildren(SysMenu sysMenu, List<SysMenu> sysMenuList) {
        // SysMenu有属性private List<SysMenu> children;封装下一层数据
        sysMenu.setChildren(new ArrayList<>());
        // 递归查询
        // 判断sysMenu的id 和 sysMenuList的parent_id是否一致
        for (SysMenu menu : sysMenuList) {
            if (sysMenu.getId().longValue() == menu.getParentId().longValue()){
                // menu就是他的下层数据，需要封装
                sysMenu.getChildren().add(findChildren(menu,sysMenuList));
            }
        }
        return sysMenu;
    }
}
